GtkSearchEngine: Avoid a crash
authorMatthias Clasen <mclasen@redhat.com>
Fri, 19 Jun 2015 04:32:49 +0000 (00:32 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Fri, 19 Jun 2015 04:32:49 +0000 (00:32 -0400)
Add a destroy notify for the data of the callback, so we don't
end up leaving a dangling pointer behind for a short while if
the native engine is finalized before the simple one. This
was showing up as crash when typing and backspacing in the
search entry of the file chooser.

gtk/gtksearchengine.c
gtk/gtksearchenginesimple.c
gtk/gtksearchenginesimple.h

index de992e5666ccd79131d4752972b23636a0bc34d0..67110f936b85e98ffe0ba6c9fce0bf6b9729ff76 100644 (file)
@@ -334,7 +334,8 @@ _gtk_search_engine_new (void)
       connect_engine_signals (engine->priv->native, engine);
       _gtk_search_engine_simple_set_indexed_cb (GTK_SEARCH_ENGINE_SIMPLE (engine->priv->simple),
                                                 _gtk_search_engine_tracker_is_indexed,
-                                                engine->priv->native);
+                                                g_object_ref (engine->priv->native),
+                                                g_object_unref);
     }
 #endif
 
index b405aef97621da57eb81493e2d8128f0826fc523..00543eaa93322e1e5d5160e68c9b6d34296bb354 100644 (file)
@@ -57,6 +57,7 @@ struct _GtkSearchEngineSimplePrivate
 
   GtkSearchEngineSimpleIsIndexed is_indexed_callback;
   gpointer                       is_indexed_data;
+  GDestroyNotify                 is_indexed_data_destroy;
 };
 
 
@@ -83,6 +84,13 @@ gtk_search_engine_simple_dispose (GObject *object)
       priv->active_search = NULL;
     }
 
+  if (priv->is_indexed_data_destroy)
+    priv->is_indexed_data_destroy (priv->is_indexed_data);
+
+  priv->is_indexed_callback = NULL;
+  priv->is_indexed_data = NULL;
+  priv->is_indexed_data_destroy = NULL;
+
   G_OBJECT_CLASS (_gtk_search_engine_simple_parent_class)->dispose (object);
 }
 
@@ -365,8 +373,13 @@ _gtk_search_engine_simple_new (void)
 void
 _gtk_search_engine_simple_set_indexed_cb (GtkSearchEngineSimple          *engine,
                                           GtkSearchEngineSimpleIsIndexed  callback,
-                                          gpointer                        data)
+                                          gpointer                        data,
+                                          GDestroyNotify                  destroy)
 {
+  if (engine->priv->is_indexed_data_destroy)
+    engine->priv->is_indexed_data_destroy (engine->priv->is_indexed_data);
+
   engine->priv->is_indexed_callback = callback;
   engine->priv->is_indexed_data = data;
+  engine->priv->is_indexed_data_destroy = destroy;
 }
index 83a60b18749e12ec85f3aac29464b9b9758f6731..421b208e3209a7d754af5af7bf48703b15acf652 100644 (file)
@@ -57,7 +57,8 @@ typedef gboolean (*GtkSearchEngineSimpleIsIndexed) (GFile *location, gpointer da
 
 void             _gtk_search_engine_simple_set_indexed_cb (GtkSearchEngineSimple *engine,
                                                            GtkSearchEngineSimpleIsIndexed callback,
-                                                           gpointer                       data);
+                                                           gpointer                       data,
+                                                           GDestroyNotify                 destroy);
 
 G_END_DECLS